// Año: 2011
// Autor: Eduardo Sanchez

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FILENAME "Hello.txt"

// Declaracion de estructuras
typedef struct s_fecha{
    int dia;
    int mes;
    int anio;
} t_fecha;


typedef struct s_campo{
    short id;
    char nombre[50];
    t_fecha fecha;
    long cuenta;
} t_campo;


//Fin declaracion de estructuras

//para despues

typedef struct s_bdd{
    t_campo c;
    struct s_bdd* next;
} t_bdd;


typedef struct s_lista {
		t_bdd *inicio;
		int tam;
} t_lista;



t_lista inicializar(t_campo dato_nuevo){    
    t_lista lista;
    t_bdd *entrada;
    entrada = (t_bdd *) malloc(sizeof(t_bdd));
    entrada->c = dato_nuevo;
    entrada->next = NULL;
    lista.inicio = entrada;
    lista.tam=1;
    return (lista);
}


t_lista agregar(t_lista lista, t_campo dato_nuevo){    
    t_bdd *entrada;
    entrada = (t_bdd *) malloc(sizeof(t_bdd));
    entrada->c = dato_nuevo;
    entrada->next = lista.inicio;
    lista.inicio = entrada;
    lista.tam++;
    return (lista);
}


int liberar(t_lista *lista){    
    t_bdd *entrada=lista->inicio;
    while (entrada!=NULL){
        lista->inicio=entrada->next;
        free(entrada);
        entrada = lista->inicio;
        lista->tam--;
    }
    return (0);
}


int mostrar_lista(t_lista lista){
    t_bdd *entrada = lista.inicio;
    do {
        mostrar_campo(entrada->c);
        entrada = entrada->next;
    } while (entrada!=NULL);
    return 0;
}

t_fecha retornar_fecha(int dia, int mes, int anio){
    t_fecha f;
    f.dia = dia;
    f.mes = mes;
    f.anio = anio;
    return (f);
}

// Declaracion de funciones auxiliares..
int mostrar_fecha(t_fecha f){
    printf("Fecha: %d/%d/%d",f.dia, f.mes, f.anio);
    return 0;
}

int mostrar_campo(t_campo c){
    printf("id: %d\t Nombre: %s\t\t\t", c.id, c.nombre);
    mostrar_fecha(c.fecha);
    printf("\tCuenta: %lx\n", c.cuenta);
    return 0;
}

int insertar_campo(t_campo *c, short id_nuevo, char nombre_nuevo[50], t_fecha fecha_nueva, unsigned long cuenta_nueva){
    c->id=id_nuevo;
    strcpy(c->nombre, nombre_nuevo);
    c->fecha=fecha_nueva;
    c->cuenta=cuenta_nueva;
    return 0;
}


//bajar_a_archivo

int bajar_lista_a_archivo(t_lista lista){
    FILE *p = NULL;
    char *file = "Hello.txt";
    t_bdd *ptr_campo;

    p = fopen(file, "w+");
    if (p== NULL) {
        printf("Error in opening a file..%s\n", file);
    }

    ptr_campo = lista.inicio;
    while (ptr_campo!=NULL){
        fwrite(&(ptr_campo->c), sizeof(t_campo), 1, p);
        ptr_campo = ptr_campo->next;
    }

    fclose(p);
    return 0;
}


// La siguiente funcion asume que al menos existe un campo completo de tipo t_campo en el archivo
t_lista levantar_lista_de_archivo(){
    FILE *p = NULL;
    char *file = FILENAME;
    int campos=0;
    t_lista lista;
    t_campo dato_nuevo;

    p = fopen(file, "r");
    if (p== NULL) {
        printf("Error in opening a file..%s\n", file);
        return lista;
    }

    fread(&dato_nuevo, sizeof(t_campo), 1, p);
    lista = inicializar(dato_nuevo);
    campos++;

    while (fread(&dato_nuevo, sizeof(t_campo), 1, p)!=0){
        lista = agregar(lista, dato_nuevo);
        campos++;
    }

    fclose(p);
    printf("Se ingresaron %d campos en memoria!\n", campos);
    return (lista);
}


//Funcion principal
int main(char argv[], int argc){
    t_lista lista;
    lista = levantar_lista_de_archivo();
    liberar(&lista);

return 0;
}


int main2(char argv[], int argc){
    t_fecha fecha;
    t_campo c;
    t_lista lista;
    short id=5000;
    char nombre[50]="Ali Baba y los 40";
    unsigned long cuenta=0xAABBCCEEFF001122;
    fecha.dia=24;
    fecha.mes=3;
    fecha.anio=1981;

    insertar_campo(&c, id, nombre, fecha, cuenta);
    lista = inicializar(c);
    insertar_campo(&c, 5050, "Aristoteles Gomez", fecha, 0xaa55bb66);
    lista = agregar(lista, c);

    insertar_campo(&c, 1000, "Aristofalo del Valle", retornar_fecha(16,12,2000), 0x123456789ABCD);
    lista = agregar(lista, c);

//    mostrar_lista(lista);

    bajar_lista_a_archivo(lista);
// Liberar la memoria dinamica..
    liberar(&lista);
    printf("\n\n\n");
return 0;
}
